package com.mazaiting.manager.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.mazaiting.common.core.domain.result.Option;
import com.mazaiting.common.core.ex.exceptions.BaseException;
import com.mazaiting.common.core.ex.exceptions.BusinessException;
import com.mazaiting.common.core.ex.exceptions.EmptyObjectException;
import com.mazaiting.manager.domain.entity.SysRole;
import com.mazaiting.manager.domain.form.RoleForm;
import com.mazaiting.manager.domain.form.RoleResourceForm;
import com.mazaiting.manager.domain.query.RolePageQuery;
import com.mazaiting.manager.domain.vo.role.RolePageVO;
import com.mazaiting.manager.domain.vo.role.SysRoleDetailVO;
import com.mazaiting.mybatisplus.domain.vo.BasePageVO;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * sys_role角色表 服务类
 *
 * @author 党海亮
 * @since 2022-03-22
 */
public interface ISysRoleService extends IService<SysRole> {

    /**
     * 角色下拉列表
     * @return 角色列表
     */
    List<Option<Long>> listRoleOptions() throws EmptyObjectException;

    /**
     * 角色分页列表
     * @param queryParams 查询参数
     * @return 分页数据
     */
    BasePageVO<RolePageVO> listRolePages(RolePageQuery queryParams) throws EmptyObjectException;

    /**
     * 根据角色 ID 查询系统角色详情
     * @param roleId 角色 ID
     * @return 系统角色 ID 详情
     */
    SysRoleDetailVO findById(Long roleId) throws EmptyObjectException;

    /**
     * 新增角色
     * @param roleForm 角色表单
     * @return true: 新增成功; false: 新增失败
     */
    boolean save(RoleForm roleForm) throws BusinessException;

    /**
     * 新增角色
     * @param roleForm 角色表单
     * @return true: 新增成功; false: 新增失败
     */
    boolean update(RoleForm roleForm) throws BaseException;

    /**
     * 删除角色
     * @param ids ID 列表. 删除角色，多个以英文逗号(,)分割
     * @return true: 删除成功; false: 删除失败
     */
    boolean delete(String ids) throws BusinessException;

    /**
     * 获取角色的资源ID集合-资源包括菜单和权限ID
     * @param roleId 角色 ID
     * @return 获取角色的资源ID集合
     */
    RoleResourceForm getRoleResources(Long roleId);

    /**
     * 分配角色的资源权限
     * @param roleId 角色 ID
     * @param roleResourceForm 角色资源表单
     * @return true: 修改成功; false: 修改失败
     */
    @Transactional(rollbackFor = Exception.class)
    boolean updateRoleResource(Long roleId, RoleResourceForm roleResourceForm);
}
